﻿using JT808Protocol.Common;
using JT808Protocol.Models.Enums;
using System;
using System.Collections.Generic;

namespace JT808Protocol.Models.BodyParserStrategy.Control
{
    /// <summary>
    /// 终端控制
    /// </summary>
    public class PrControl_0x8105 : IJT808Body
    {
        /// <summary>
        /// 终端控制命令
        /// </summary>
        public EnumDeviceControlCommand CommandWord { get; set; }

        /// <summary>
        /// 终端控制命令参数
        /// 每个字段之间采用
        /// 半角”;”分隔，每个 STRING 字段先按 GBK 编码处
        /// 理后再组成消息
        /// </summary>
        public string Parameter { get; set; }

        public override IJT808Body ReadBody(ReadOnlySpan<byte> data, ref int index)
        {
            throw new NotImplementedException();
        }

        public override List<byte> WriteToBytes()
        {
            var bytes = new List<byte>();

            bytes.Add((byte)CommandWord);
            if ((byte)CommandWord < 3)
            {
                string connectionCtrl; //连接控制
                string superiorAuthCode; //监管平台鉴权码
                string url; //url地址
                string dialupPoint; //拨号点名称
                string dialUser; //拨号用户名
                string dialPassword; //拨号密码
                string ipAddress; //地址
                string tcpPort; //tcp端口
                string udpPort; //udp端口
                string ManuacturerId; //制造商Id
                string hardwardVer; //硬件版本
                string firmwareVer; //固件版本
                string connectTimeLimit; //连接时限

                if (string.IsNullOrEmpty(Parameter))
                    throw new ArgumentNullException(nameof(Parameter), "若进行无线升级(0x01)或控制终端连接指定服务器(0x02)，终端命令参数是必需的");

                string[] strArray = Parameter.Split(";");

                switch ((byte)CommandWord)
                {
                    case 0x01: //无线升级
                        if (strArray.Length < 11)
                            throw new ArgumentException("无线升级:终端控制命令参数格式错误");

                        url = strArray[0];
                        dialupPoint = strArray[1];
                        dialUser = strArray[2];
                        dialPassword = strArray[3];
                        ipAddress = strArray[4];
                        tcpPort = strArray[5];
                        udpPort = strArray[6];
                        ManuacturerId = strArray[7];
                        hardwardVer = strArray[8];
                        firmwareVer = strArray[9];
                        connectTimeLimit = strArray[10];

                        bytes.AddRange(ParseHelper.GbkBytes(url));
                        bytes.Add(0x2c); //, （半角逗号Ascii码）
                        bytes.AddRange(ParseHelper.GbkBytes(dialupPoint));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(dialUser));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(dialPassword));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(ipAddress));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(tcpPort)));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(udpPort)));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.AsciiBytes(ManuacturerId));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(hardwardVer));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(firmwareVer));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(connectTimeLimit)));

                        break;

                    case 0x02: //控制终端连接指定服务器

                        if (strArray.Length < 9)
                            throw new ArgumentException("控制终端连接指定服务器:终端控制命令参数格式错误");

                        connectionCtrl = strArray[0];
                        superiorAuthCode = strArray[1];
                        dialupPoint = strArray[2];
                        dialUser = strArray[3];
                        dialPassword = strArray[4];
                        ipAddress = strArray[5];
                        tcpPort = strArray[6];
                        udpPort = strArray[7];
                        connectTimeLimit = strArray[8];

                        bytes.Add(Convert.ToByte(connectionCtrl));
                        bytes.Add(0x2c); //, （半角逗号Ascii码）
                        bytes.AddRange(ParseHelper.GbkBytes(superiorAuthCode));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(dialupPoint));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(dialUser));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(dialPassword));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.GbkBytes(ipAddress));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(tcpPort)));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(udpPort)));
                        bytes.Add(0x2c);
                        bytes.AddRange(ParseHelper.Bytes(Convert.ToUInt16(connectTimeLimit)));

                        break;
                }
            }

            return bytes;
        }
    }
}